-- 获取锁
-- 锁的 key
local lockKey = KEYS[1]
-- 线程唯一标识
local threadId = ARGV[1]
-- 锁自动释放时间
local leaseTime = ARGV[2]

-- 判断锁是否存在
if (redis.call('exists', lockKey) == 0) then
    -- 不存在，则获取锁成功
    redis.call('hset', lockKey, threadId, 1)
    -- 设置有效期
    redis.call('expire', lockKey, leaseTime)
    return 1
end

-- 锁已经存在，判断线程标识是否是自己
if (redis.call('hexists', lockKey, threadId) == 1) then
    -- 重入次数 +1
     redis.call('hincrby', lockKey, threadId, 1)
    -- 设置有效期
    redis.call('expire', lockKey, leaseTime)
    return 1
end

-- 代码走到这里，说明获取锁的不是自己，获取锁失败
return 0